/**
 * 小游戏API 抽象封装
 * 以微信API接口为基础接口
 * 子类可继承重写参数和方法
 * by 零一互动 2020-11-9
 * */
import { dataField } from "./dataField";

export interface toastParams {
    //属性	类型	默认值	必填	说明
    title: string;//		是	提示的内容
    icon?: string;//	'success'	否	图标
    image?: string;//		否	自定义图标的本地路径，image 的优先级高于 icon	1.1.0
    duration?: number;//	1500	否	提示的延迟时间
    mask?: boolean;//	false	否	是否显示透明蒙层，防止触摸穿透
    success?: () => void;//		否	接口调用成功的回调函数
    fail?: () => void;//		否	接口调用失败的回调函数
    complete?: () => void;//		否	接口调用结束的回调函数（调用成功、失败都会执行）

}

export interface loadParams {
    //属性	类型	默认值	必填	说明
    title: string;//		是	提示的内容
    mask?: boolean;//	false	否	是否显示透明蒙层，防止触摸穿透
    success?: () => void;//		否	接口调用成功的回调函数
    fail?: () => void;//		否	接口调用失败的回调函数
    complete?: () => void;//		否	接口调用结束的回调函数（调用成功、失败都会执行）
}

export interface ModalParams {
    title?: string;//		否	标题	1.0.0
    content?: string;//		否	内容	1.0.0
    confirmText?: string;//	确定	否	确定按钮的文案，最多 4 个字符	1.0.0
    showCancel?: boolean;//	true	否	是否显示取消按钮	1.0.0
    cancelText?: string;//	取消	否	取消按钮的文案，最多 4 个字符	1.0.0
    success?: (result: { errMsg: string, confirm: boolean, cancel: boolean }) => void;//		否	接口调用成功后的回调函数	1.0.0
    fail?: (err: { errMsg: string }) => void;//		否	接口调用失败后的回调函数	1.0.0
    complete?: () => void;//		否	接口调用结束后的回调函数（调用成功、失败都会执行）	1.0.0
}

export interface UserInfo {
    nickName: string;       //用户昵称
    avatarUrl: string;      //用户头像图片的 URL。URL 最后一个数值代表正方形头像大小（有 0、46、64、96、132 数值可选，0 代表 640x640 的正方形头像，46 表示 46x46 的正方形头像，剩余数值以此类推。默认132），用户没有头像时该项为空。若用户更换头像，原有头像 URL 将失效。
    gender: number;         //gender 的合法值    0	未知    1	男性    2	女性
    country: string;        //用户所在国家
    province: string;        //用户所在省份
    city: string;            //用户所在城市
    language: string         //显示country，province，city所用的语言 en	英文	zh_CN	简体中文 zh_TW	繁体中文
}

export interface getUserInfoParams {
    //属性	类型	默认值	必填	说明
    withCredentials?: boolean;   //		否	是否带上登录态信息。当 withCredentials 为 true 时，要求此前有调用过 wx.login 且登录态尚未过期，此时返回的数据会包含 encryptedData, iv 等敏感信息；当 withCredentials 为 false 时，不要求有登录态，返回的数据不包含 encryptedData, iv 等敏感信息。
    lang?: string;               //	en	否	显示用户信息的语言
    success?: (res: { userInfo: UserInfo }) => void;//		否	接口调用成功的回调函数
    fail?: () => void;//		否	接口调用失败的回调函数
    complete?: () => void;//		否	接口调用结束的回调函数（调用成功、失败都会执行）
}

export interface loginParams {
    // 属性	类型	默认值	必填	说明	最低版本
    timeout?: number;       //		否	超时时间，单位ms	1.9.90
    success?: (res: { code: string }) => void;       //	否	接口调用成功的回调函数
    fail?: () => void;      //否	接口调用失败的回调函数
    complete?: () => void;       //否	接口调用结束的回调函数（调用成功、失败都会执行）
    force?: boolean;
}

export interface authorizeParams {
    // 属性	类型	默认值	必填	说明	最低版本
    scope?: string;         //是	需要获取权限的 scope，详见 scope 列表
    success?: () => void;       //	否	接口调用成功的回调函数
    fail?: () => void;      //否	接口调用失败的回调函数
    complete?: () => void;       //否	接口调用结束的回调函数（调用成功、失败都会执行）
}

export interface gameRecorderStartParams {
    //属性	类型	        默认值	是否必填	说明	最低版本
    duration: number;       //	10	否	录屏的时长，单位 s，必须大于 3s，最大值 300s（5 分钟）。
    isMarkOpen?: boolean;   //	true	否	是否添加水印，会在录制出来的视频上添加默认水印，目前不支持自定义水印图案。	1.69.0+
    locTop?: number;        //	0	否	水印距离屏幕左边界的位置，单位为 dp。	1.69.0+
    locLeft?: number;       //	0	否	水印距离屏幕上边界的位置，单位为 dp。
}

//分享视频排序类型
export enum SHARE_VIDEO_SORT_TYPE {
    HOT,    //热门
    TIME   //发布时间
}

//分享视频结果 以字跳为基准
export interface ShareVideoRankDetail {
    video_id: string;//视频ID
    digg_count: string;//点赞数
    cover_url: string;//	视频封面图链接地址
    source: number;//	宿主端标识符，1128(抖音)，1112（抖音火山），13（头条）
    user_name: string;//	作者昵称
    rank: number;//	视频排行榜排名，从 1 开始累加
    video_tag: string;//	视频的 videoTag 值
}

//基本事件
export class analyticsBase {
    protected key: string;
    protected obj: object;

    constructor(key: string) {
        this.key = key;
    }

    getKey() {
        return this.key;
    }

    getObj() {
        return this.obj;
    }

    setObj(obj: object) {
        this.obj = JSON.parse(JSON.stringify(obj));
    }
}

interface lookVideo {
    src: string;
}

export class analyticsLookVideo extends analyticsBase {
    protected key: string;
    protected obj: lookVideo;

    //
    constructor(src: string) {
        super('lookVideo');
        this.obj = { src };
    }
}

//震动类型
export enum VIBRATE_TYPE {
    LONG,
    SHORT,
}

export default abstract class MiniApp {
    //应用ID
    protected abstract m_appId: string;
    //密钥
    protected abstract m_secret: string;
    protected abstract m_adUnitId: string;

    //验证授权
    abstract validAppId(): void;

    //初始化
    abstract preCreateUnits(): void;

    /**
     * 加载并显示视频广告
     * @param successCallback 成功回调
     * @param errorCallback 失败回调
     * @param completeCallback 完成回调
     * @param reportAnalyticsExplain 成功上报描述
     */
    abstract loadAndShowVideoAd(successCallback: () => void,
        errorCallback: (error: any) => void,
        completeCallback?: () => void,
        reportAnalyticsExplain?: string): void;

    //获取用户数据
    abstract getUserInfo(params: getUserInfoParams): void;

    //显示提示框
    abstract showToast(params: toastParams): void;

    //显示进度框
    abstract showLoading(params: loadParams): void;

    //显示对话框
    abstract showModal(params: ModalParams): void;

    //隐藏进度框
    abstract hideLoading(): void;

    //授权
    abstract authorize(params: authorizeParams): void;

    //登录
    abstract login(params: loginParams): void;

    //是否有分享录屏
    abstract isHaveShareVideo(): boolean;
    //获取手机信号
    abstract getSystemInfoSync();

    //开始录屏
    abstract gameRecordStart(params: gameRecorderStartParams, onStart?: (res) => void): void;

    //停止录屏
    abstract gameRecordStop(): boolean;

    //分享录屏
    abstract shareGameRecordVideo(successCb?: () => void, failCb?: (e?) => void): void;

    //是否为线上正式版本
    abstract isProduction(): boolean;

    //发送埋点
    abstract reportAnalytics(eventKey: string, data: any): void;

    //清理内存
    abstract clearMemory(): void;

    //分享事件
    abstract shareAppMessage(args: any): void;

    //显示banner广告
    abstract showBannerAD(node: cc.Node, successCallback?: () => void, errorCallback?: (error: any) => void, onCloseCallBack?: () => void, setBannerPosition?: ({
        screenWidth,
        screenHeight
    }) => cc.Vec2): void;

    //隐藏banner广告
    abstract hideBanner(): void;

    //显示插屏
    abstract showInterstitialAd(onAdClose: () => void, onFailed: () => void): void;

    //显示原生广告  -LY
    abstract showNativeAd(successCallback: (a: Array<any>) => void, errorCallback: (error: any) => void, completeCallback?: () => void): void;

    //原生广告点击上报
    abstract reportAdClickNativeAd(): void;

    //添加更多游戏按钮
    abstract createMoreGameBtn(): void;

    //添加桌面
    abstract addShortcut(): Promise<boolean>;

    //开始直播
    abstract operateGameLive(): void;

    //获取分享视频排行
    abstract getShareVideoRank(sortType: SHARE_VIDEO_SORT_TYPE, successCb: (data: ShareVideoRankDetail[]) => void): void;

    //绘制在线图片
    abstract drawUrlImage(url: string, overCb: (spf: cc.SpriteFrame) => void): void;

    //绘制头像
    abstract drawHead(headUrl: string): Promise<cc.SpriteFrame>;

    //显示视频
    abstract showVideo(videoUrl: string): void;

    //订阅消息
    abstract subscribeMessage(successCallback?: () => void, failCallback?: () => void, completeCallback?: () => void): void;

    //添加收藏
    abstract showAddFavoriteGuide(successCallback?: () => void, failCallback?: () => void, completeCallback?: () => void): void;

    //开始录音
    abstract StartRecordSound(): void;

    //结束录音
    abstract StopRecordSound(successCallback?: () => void): void;

    //播放最后一次录音
    abstract PlayLastRecordSound(scale?: number, successCb?: () => void, errorCb?: () => void): void;

    //地区是否在屏蔽列表
    abstract LocalInBlockCityList(): boolean;

    //手机震动
    abstract vibrate(type: VIBRATE_TYPE): void;

    //@ts-ignore 提交排行榜
    abstract async commitRank(score: number): Promise<boolean>;

    //@ts-ignore 展示排行榜
    abstract async showRank(): Promise<boolean>;

    //跳转到其他小程序
    abstract navigateToMiniGame(appId: string, successCallback?: () => void, failCallback?: () => void): void;

    //全屏视频
    abstract fullScreenVideo(): Promise<void>;

    //h5全屏适配
    abstract WidgetfullScreen(): Promise<void>;

    //是否为正式版本
    static isProduction(): boolean {
        return true;
    }
}







































